package com.learning.spring.ioc.webapplicationcontext.config;

/**
 * ClassName: ContainerWebApplicationContext
 * Description: Web应用的上下文容器
 * Date: 2018/8/2 14:33 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class ContainerWebApplicationContext {

    public static void main(String[] args) {

    }

    /**
     * WebApplicationContext 类体系结构：专门为Web 应用准备，扩展了 ApplicationContext。
     * 1.
     * 2. 添加 Bean 的三个新的作用域，request、session、global session、application
     * 3. 定义了一个常量 ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE ，在上下文启动时，WebApplicationContext 实例以此键放置在 ServletContext 的属性列表中
     * 4. WebApplicationContextUtils：getWebApplicationContext() 可以从servletContext 中获取 WebApplicationContext 实例，内部就是通过 ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE 获取的。
     * 5. getServletContext() 方法获取 ServletContext。这样 WebApplicationContext 与 ServletContext 可以相互访问
     * <p>
     * ConfigurableWebApplicationContext 扩展了 WebApplicationContext，允许通过配置的方式实例化 WebApplicationContext
     * 1. setServletContext：为Spring设置 Web 应用上下文
     * 2. setConfigLocation：设置spring 配置文件地址，一般情况下，配置文件地址是相对于 Web 根目录的地址，如/WEB-INF/XXX。可以使用带资源类型前缀的地址，classpath:XXX
     * <p>
     * XmlWebApplicationContext、 AnnotationConfigWebApplicationContext 分别对应xml配置与注解实现
     */
    static void test() {

    }

    /**
     * WebApplicationContext 初始化，需要ServletContext 实例，就需要Web 容器支持。需要在 Web.xml 中配置
     * 1. ContextLoaderListener 监听器，通过获取 contextConfigLocation 参数，得到spring的配置
     * 2. 如果使用JavaConfig 配置，这参数配置为 contextClass、contextConfigLocation。
     * 3. ContextLoaderListener 获取参数 contextClass ，如果不为空，`createWebApplicationContext()` 方法会创建 AnnotationConfigWebApplicationContext 上下文，并且解析 contextConfigLocation获取的标注了@Configuration 的类
     */
    static void test2() {

        /*
        // 指定配置文件
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:/spring/spring-context.xml</param-value>
        </context-param>

        // 监听器
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        */

        /*
        // JavaConfig 配置
        // 指定Spring 使用  AnnotationConfigWebApplicationContext 上下文
        <context-param>
            <param-name>contextClass</param-name>
            <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </context-param>
        // 指定配置类：标注了@Configuration 的类
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>cn.com.sinosoft.smp.web.sys.config.SysConfig</param-value>
        </context-param>

        // 监听器
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        * */

    }


    /**
     * Servlet 3.0 支持使用 ServletContainerInitializer 代替 web.xml 配置
     * 1、Spring 的SpringServletContainerInitializer 类 实现了 ServletContainerInitializer接口，并且标注 WebApplicationInitializer 处理业务
     * 2、实现方式
     * 1）实现 WebApplicationInitializer ，重写 onStartup 方法
     * 2）继承 WebApplicationInitializer 默认实现 AbstractContextLoaderInitializer，重写方法
     */
    static void test3() {

    }
}
